package cn.hchaojie.javase.day09;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.junit.Test;

public class TestListApi {
	@Test
	public void test1() {
		List<String> list = new ArrayList<>();
		list.add("abc");
		list.add("bcd");
		
		System.out.println(list.size());
		
		// 可以按索引取元素
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		
		list.add(0, "aaa");
		System.out.println(list);
		
		// 容器大小
		System.out.println(list.size());
		
		// 根据索引删除元素
		list.remove(list.size() - 1);
		System.out.println(list);		// [aaa, abc]

		// 根据对象删除元素
		list.remove("abd");
		list.remove("abc");			// [aaa]
		System.out.println(list);
		
		// 判断元素是否存在
		System.out.println(list.contains("abc"));	// false
		System.out.println(list.contains("aaa"));	// true
	}
	
	// list集合的遍历方式
	@Test
	public void test2() {
//		List<String> list = new ArrayList<>();
//		list.add("abc");
//		list.add("def");
//		list.add("gh");
		
		List<String> list = Arrays.asList("abc", "def", "gh");
		
		// 遍历方式一
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		// 方式二：增强的for循环
		for (String element : list) {
			System.out.println(element);
		}
		
		// 方式三：迭代器模式
		Iterator<String> itr = list.iterator();
		while (itr.hasNext()) {		// 如果还有下一个
			// 取出下一个
			String next = itr.next();	// itr.next()返回容器里面下一个元素
			System.out.println(next);
		}
	}
	
	// 遍历时删除元素
	@Test
	public void test3() {
		List<String> list = new ArrayList<>();
		list.add("张三");
		list.add("李四");
		list.add("王麻子");
		
		// 这种方式创建的list集合，不支持删除操作
//		List<String> list = Arrays.asList("abc", "def", "gh");
//		list.remove(0);
		
		// 删除姓王的人名
		for (int i = 0; i < list.size(); i++) {
			String name = list.get(i);	// 获取当前元素
			
			// 是否姓王
			if (name.charAt(0) == '张') {
				list.remove(i);
			}
		}
		
		System.out.println(list);
	}
	
	// 使用增强的for循环，在遍历的同时删除元素，可能会报错。
	@Test
	public void test4() {
		List<String> list = new ArrayList<>();
		list.add("张三");
		list.add("李四");
		list.add("王麻子");
		
		// 删除姓王的人名
		for (String name : list) {
			// 是否姓王
			if (name.charAt(0) == '张') {
				list.remove(name);
			}
		}
		
		System.out.println(list);
	}
	
	// 使用迭代器模式，一边遍历，一边删除
	@Test
	public void test5() {
		List<String> list = new ArrayList<>();
		list.add("张三");
		list.add("李四");
		list.add("王麻子");
		
		Iterator<String> iterator = list.iterator();
		while (iterator.hasNext()) {
			String name = iterator.next();
			
			// 是否姓王
			if (name.charAt(0) == '张') {
				iterator.remove();		// 使用迭代器删除元素
			}
		}
		
		System.out.println(list);
	}
	
	// Comparator		比较器
	// Comparable		可比较的
	
	// 列表排序
	@Test
	public void test6() {
		List<String> list = Arrays.asList("bbb", "aaa", "ccc", "ddd");
		
		// Arrays.sort();
		// 必须要让Collection知道元素之间是如何比较的
		
		// sort方法接收的容器，里面的元素必须要实现Comparable接口
		Collections.sort(list);
		
		System.out.println(list);
	}
	
	// 列表排序
	@Test
	public void test7() {
		List<Student> list = Arrays.asList(
			new Student("张三", 77.5),
			new Student("李四", 60),
			new Student("王五", 99),
			new Student("赵六", 80)
		);
		
		// list里面的student没有实现Comparable接口，Collections类不知道如何比较两个Student对象
		// Collections.sort(list);
		
		// 两周方式，提供比较规则
		// 第一种方式：排序的时候提供一个比较器
		Collections.sort(list, new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				return (o1.getScore() - o2.getScore()) > 0 ? 1 : -1;
//				if (o1.getScore() > o2.getScore()) {
//					return 1;
//				} else if (o1.getScore() < o2.getScore()) {
//					return -1;
//				} else {
//					return 0;
//				}
			}
		});
		
		// 第二种方式，元素本身实现Comparable接口
		
		
		System.out.println(list);
	}
	
	@Test
	public void test8() {
		List<Student> list = Arrays.asList(
			new Student("张三", 77.5),
			new Student("李四", 60),
			new Student("王五", 99),
			new Student("赵六", 80)
		);
		
		Collections.sort(list);
		System.out.println(list);
	}
	
	@Test 
	public void test9() {
		List<String> list = Arrays.asList("ab", "ab");
		
		System.out.println(list.size());
	}
	
	// Set集合，里面的元素是不重复的
	@Test
	public void test10() {
		Set<String> set = new HashSet<>();
		set.add("ab");
		set.add("ab");
		
		System.out.println(set.size());
	}
	
	// 给定一个字符串，判断里面有几个不同的单词。
	@Test
	public void test11() {
		String source = "list set arraylist hashset set list";
		
		String[] split = source.split(" ");
		System.out.println(Arrays.toString(split));
		
		Set<String> set = new HashSet<>();
		for (int i = 0; i < split.length; i++) {
			set.add(split[i]);
		}
		
		System.out.println(set.size());
		System.out.println(set);
	}
}
